package AcervoDAO;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import Exceptions.PesquisaItemException;
import Model.Item;
import Model.Livro;
import ServicosDAO.ConexaoDAO;

public class LivroDAO extends ItemDAO {

	public boolean adicionarLivro(Livro livro) {

		Item item = new Item();
		item.setId_item(livro.getCod_item());

		try {

			if (this.adicionarItem(item)) {
				String sql = "insert into livro values(?,?,?,?,?,?,?,?)";

				Connection conexao = new ConexaoDAO().getConnection();

				int ok = 0;

				PreparedStatement stmt = conexao.prepareStatement(sql);

				stmt.setString(1, livro.getCod_item());
				stmt.setString(2, livro.getTitulo());
				stmt.setString(3, livro.getSubtitulo());
				stmt.setString(4, livro.getAutor());
				stmt.setString(5, livro.getEditora());
				stmt.setString(6, livro.getGenero());
				stmt.setString(7, livro.getEdicao());
				stmt.setString(8, livro.getIsbn());

				ok = stmt.executeUpdate();

				stmt.close();
				conexao.close();

				if (ok == 1) {
					return true;
				}

			}

		} catch (SQLException e) {

			e.printStackTrace();
			throw new RuntimeException();
		}
		return false;
	}




	public ArrayList<Livro> livros() {
		Connection conexao = new ConexaoDAO().getConnection();

		ArrayList<Livro> lista = new ArrayList<Livro>();

		String sql = "select * from livro";

		try {

			ResultSet rs = conexao.prepareStatement(sql).executeQuery();

			while (rs.next()) {

				Livro livro = new Livro();
				livro.setCod_item(rs.getString("cod_item"));
				livro.setAutor(rs.getString("autor"));
				livro.setEdicao(rs.getString("edicao"));
				livro.setEditora(rs.getString("editora"));
				livro.setGenero(rs.getString("genero"));
				livro.setIsbn(rs.getString("isbn"));
				livro.setSubtitulo(rs.getString("subtitulo"));
				livro.setTitulo(rs.getString("titulo"));

				lista.add(livro);
			}

		} catch (SQLException e) {
			e.printStackTrace();
			throw new RuntimeException();
		}

		return lista;

	}




	public ArrayList<Livro> selectLivros(Livro livro) {
		Connection conexao = new ConexaoDAO().getConnection();

		String chave = "";
		String valor = "";

		if (!livro.getCod_item().equals("")) {
			chave = "cod_item";
			valor = livro.getCod_item();
		} else if (!livro.getAutor().equals("")) {
			chave = "autor";
			valor = livro.getAutor();
		}

		ArrayList<Livro> lista = new ArrayList<Livro>();

		try {
			ResultSet rs;

			String sql = "select * from livro where " + chave + "='" + valor
					+ "'";

			PreparedStatement stmt = conexao.prepareStatement(sql);

			rs = stmt.executeQuery();

			if (rs != null) {

				while (rs.next()) {
					Livro livr = new Livro();
					livr.setCod_item(rs.getString("cod_item"));
					livr.setAutor(rs.getString("autor"));
					livr.setEdicao(rs.getString("edicao"));
					livr.setEditora(rs.getString("editora"));
					livr.setGenero(rs.getString("genero"));
					livr.setIsbn(rs.getString("isbn"));
					livr.setSubtitulo(rs.getString("subtitulo"));
					livr.setTitulo(rs.getString("titulo"));

					lista.add(livr);
				}

				stmt.close();
				conexao.close();

			}
		} catch (SQLException e) {
			e.printStackTrace();
			throw new RuntimeException();
		}

		return lista;

	}




	public boolean removerLivro(Livro livro) {

		Connection conexao = new ConexaoDAO().getConnection();

		String sql = "delete from acervo where acervo.cod_item in (select livro.cod_item from livro where livro.cod_item=?)";

		int ok = 0;

		try {

			PreparedStatement stmt = conexao.prepareStatement(sql);

			stmt.setString(1, livro.getCod_item());

			ok = stmt.executeUpdate();

			stmt.close();
			conexao.close();

			if (ok == 1) {
				return true;
			}

		} catch (SQLException e) {

			e.printStackTrace();
			throw new RuntimeException();
		}

		return false;
	}




	public boolean atualizarLivro(Livro livro) {

		String sql = "update livro set autor='" + livro.getAutor()
				+ "', edicao='" + livro.getEdicao() + "', editora='"
				+ livro.getEditora() + "', genero='" + livro.getGenero()
				+ "', isbn='" + livro.getIsbn() + "', subtitulo='"
				+ livro.getSubtitulo() + "', titulo='" + livro.getTitulo()
				+ "' where cod_item='" + livro.getCod_item() + "'";

		Connection conexao = new ConexaoDAO().getConnection();

		int ok = 0;

		try {

			PreparedStatement stmt = conexao.prepareStatement(sql);

			ok = stmt.executeUpdate();

			stmt.close();
			conexao.close();

			if (ok == 1) {
				return true;
			}

		} catch (SQLException e) {

			e.printStackTrace();
			throw new RuntimeException();

		}
		return false;
	}




	public List<Livro> selectLivros(String termo, String palavraChave) {
		Connection conexao = new ConexaoDAO().getConnection();

		ArrayList<Livro> lista = new ArrayList<Livro>();

		String sql = "select * from livro where " + termo + " like '%"
				+ palavraChave + "%'";

		try {

			ResultSet rs = conexao.prepareStatement(sql).executeQuery();

			while (rs.next()) {
				Livro livr = new Livro();
				livr.setCod_item(rs.getString("cod_item"));
				livr.setAutor(rs.getString("autor"));
				livr.setEdicao(rs.getString("edicao"));
				livr.setEditora(rs.getString("editora"));
				livr.setGenero(rs.getString("genero"));
				livr.setIsbn(rs.getString("isbn"));
				livr.setSubtitulo(rs.getString("subtitulo"));
				livr.setTitulo(rs.getString("titulo"));

				lista.add(livr);
			}

		} catch (SQLException e) {
			throw new PesquisaItemException(e);
		}

		return lista;
	}

}
